'''
Created on 30/09/2013

@author: daniel
'''
import unittest
import maxHeap
import minHeap

class Heap():
    '''
    Esta clase decide su comportamiento en la creacion ya que __ordenamiento__ 
    sera MaxHeap o MinHeap segun lo decida el usuario
    '''
    def __init__(self,*elem):
        
        if(elem[0]==True):
            self.__ordenamiento__=maxHeap.MaxHeap()
        else:
            self.__ordenamiento__=minHeap.MinHeap()
        i=1
        while(i<len(elem)):
            self.agregar(elem[i])
#             print self.__ordenamiento__.__datos__
            i+=1
    
    def agregar(self,elem):
        self.__ordenamiento__.agregar(elem)
    
    def eliminar(self):
        return self.__ordenamiento__.eliminar()
    
    def tope(self):
        return self.__ordenamiento__.tope()
    
    def esVacia(self):
        return self.__ordenamiento__.esVacia()
    
class Test(unittest.TestCase):

    def testInit(self):
        self.assertIsInstance(Heap(True,2,3,4,5,6), Heap,"Verifica la creacion")
        self.assertIsInstance(Heap(False,6,5,4,3,2), Heap,"Verifica la creacion")
 
 
    def testagregarMaxHeap(self):
        obj=Heap(True)
        obj.agregar(41)
        self.assertEquals(obj.tope(),41, "verifica existencia del dato")
        obj.agregar(54)
        self.assertEquals(obj.tope(),54, "verifica existencia del dato")
        obj.agregar(52)
#         print "ingresa 50"
        obj.agregar(50)
#         print "ingresa 46"
        obj.agregar(46)
#         print "datos"
#         print obj.__ordenamiento__.__datos__
        self.assertEquals(obj.tope(),54, "verifica existencia del dato")
#         print "ingresa 56"
        obj.agregar(56)
        self.assertEquals(obj.tope(),56, "verifica existencia del dato")
#         print obj.__ordenamiento__.__datos__
        self.assertFalse(obj.esVacia(), "verifica existencia de elemento")
  
    def testagregarMinHeap(self):
        obj=Heap(False)
        obj.agregar(400)
        self.assertEquals(obj.tope(),400, "verifica existencia del dato")
        obj.agregar(200)
        self.assertEquals(obj.tope(),200, "verifica existencia del dato")
        obj.agregar(50)
        self.assertEquals(obj.tope(),50, "verifica existencia del dato")
        obj.agregar(30)
        self.assertEquals(obj.tope(),30, "verifica existencia del dato")
        obj.agregar(40)
        self.assertEquals(obj.tope(),30, "verifica existencia del dato")
        obj.agregar(31)
#         print obj.__ordenamiento__.__datos__
        self.assertEquals(obj.tope(),30, "verifica existencia del dato")
        self.assertFalse(obj.esVacia(), "verifica existencia de elemento")
  
       
    def testTopeMaxHeap(self):
        obj=Heap(True)
        obj.agregar(41)
        self.assertEquals(obj.tope(),41, "verifica existencia del dato")
        obj.agregar(52)
        self.assertEquals(obj.tope(),52, "verifica existencia del dato")
        obj.agregar(54)
        self.assertEquals(obj.tope(),54, "verifica existencia del dato")
        
    def testTopeMinHeap(self):
        obj=Heap(False)
        obj.agregar(41)
        self.assertEquals(obj.tope(),41, "verifica existencia del dato")
        obj.agregar(52)
        self.assertEquals(obj.tope(),41, "verifica existencia del dato")
        obj.agregar(54)
        self.assertEquals(obj.tope(),41, "verifica existencia del dato")
      
    def testEliminarMaxHeap(self):
        obj=Heap(True)
        obj.agregar(56)
        obj.agregar(50)
        obj.agregar(54)
        obj.agregar(41)
        obj.agregar(46)
        obj.agregar(52)
        self.assertFalse(obj.esVacia(), "verifica existencia de elemento")
        elim=obj.eliminar()
        self.assertFalse(obj.esVacia(), "verifica la no existencia de elemento")
        self.assertEquals(obj.tope(), 54, "Verifica reacomodamiento")
        self.assertEquals(elim, 56,"elemento eliminado")

    def testEliminarMinHeap(self):
        obj=Heap(False)
        obj.agregar(2)
        obj.agregar(5)
        obj.agregar(9)
        obj.agregar(6)
        obj.agregar(7)
        obj.agregar(13)
        obj.agregar(15)
        obj.agregar(8)
        obj.agregar(90)
        obj.agregar(10)
        self.assertFalse(obj.esVacia(), "verifica existencia de elemento")
        elim=obj.eliminar()
        self.assertEquals(elim, 2, "Verifica eliminado")
        self.assertEquals(obj.tope(), 5, "Verifica reacomodamiento")
#         print obj.__ordenamiento__.__datos__
        self.assertFalse(obj.esVacia(), "verifica la no existencia de elemento")

        elim=obj.eliminar()
        self.assertEquals(elim, 5, "Verifica eliminado")
        self.assertEquals(obj.tope(), 6, "Verifica reacomodamiento")
#         print obj.__ordenamiento__.__datos__
        self.assertFalse(obj.esVacia(), "verifica la no existencia de elemento")

       
    def testEsVacia(self):
        obj=Heap(True)
        self.assertTrue(obj.esVacia(), "Verifica devolucion correcta")
        obj.agregar(1)
        self.assertFalse(obj.esVacia(), "Verifica devolucion correcta")
        obj=Heap(False)
        self.assertTrue(obj.esVacia(), "Verifica devolucion correcta")
        obj.agregar(1)
        self.assertFalse(obj.esVacia(), "Verifica devolucion correcta")
    

if __name__ == "__main__":
    #import sys;sys.argv = ['', 'Test.testName']
    unittest.main()